package com.demo.webapp.context;

import com.demo.core.model.Site;

import org.springframework.core.NamedThreadLocal;
import org.springframework.util.Assert;

/**
 * 多站点上下文容器Holder<br>
 * 多线程容器,存储当前Site信息线程中.<br>
 * 
 * @author ryuu.kk
 */
public abstract class MultisiteContextHolder {
	/**
	 * 本地线程局部变量:将站点上下文存储到线程中
	 */
	private static final ThreadLocal<MultisiteContext<? extends Site>> contextHolder = new NamedThreadLocal<MultisiteContext<? extends Site>>("Multisite context");

	/**
	 * 清除上下问容器
	 */
	public static void clearContext() {
		contextHolder.remove();
	}
	
	/**
	 * 返回多站点模型Site.当不存在时,将返回null
	 * @return 多站点Site模型
	 */
	public static Site getSite() {
		return getContext().getMultisite();
	}
	/**
	 * 返回多站点上下文容器,如果不存在,新建一个.
	 * @return 多站点上下文
	 */
	public static MultisiteContext<? extends Site> getContext() {
		MultisiteContext<?> ctx = contextHolder.get();
		if (ctx == null) {
			ctx = createEmptyContext();
			contextHolder.set(ctx);
		}
		return ctx;
	}

	/**
	 * 设置多站点上下文容器
	 * @param context 多站点上下文容器
	 */
	public static void setContext(MultisiteContext<? extends Site> context) {
		Assert.notNull(context, "Only non-null MultisiteContext instances are permitted");
		contextHolder.set(context);
	}
	/**
	 * 创建多站点上下文容器对象
	 * @return 简单的多站点上下文容器对象
	 */
	protected static MultisiteContext<? extends Site> createEmptyContext() {
		return new SimpleMultisiteContext();
	}
}
